package com.edu.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;

import java.util.Date;

/**
 * @Author:何包蛋
 * @Date :2022/11/3 - 11 - 03 - 15:27
 */
/*
   使用 xml 配置aop
*            通知类
*
* */
public class LogAdvise{
    /*
     *   在前置 通知的方法中 可以 加入 JoinPoint 表示连接点
     *           jt.getSignature.getName() 获取方法名字
     *           jt.getTarget() 获取目标对象（被代理对象）
     *           jt.getArgs() 获取方法 执行时的参数
     * */
    public void before(JoinPoint jt){
        String methodName = jt.getSignature().getName();
//        Object[] args = jt.getArgs();
//        Object target = jt.getTarget();
//        System.out.println("目标对象"+target);
//        System.out.println("方法名:"+methodName);
//        for (Object arg : args) {
//            System.out.println("方法的参数:"+arg);
//        }
//        System.out.println("前置通知");
        System.out.println("日志："+jt.getSignature().getName()+"开始时间："+new Date());
    }

    public void afterReturning(JoinPoint jt, Object result){
        System.out.println(result);
//        System.out.println("后置返回 通知");
        System.out.println("日志："+jt.getSignature().getName()+"结束时间"+new Date());
    }

    public void afterThrowing(JoinPoint jt,Exception e){
        System.out.println(jt.getSignature().getName()+"出错了"+e.toString());
    }

    public void after(){
        System.out.println("后置通知");
    }

    public Object around(ProceedingJoinPoint pjt) throws Throwable {
//        System.out.println("执行了 环绕通知的 前置处理");
        long start = System.currentTimeMillis();
        Object o = pjt.proceed(); //代表原方法的放行
//        System.out.println("执行了 环绕通知的 后置处理");
        Thread.sleep(1000);
        long end = System.currentTimeMillis();
        System.out.println("执行时间："+(end-start));
        return o;
    }
}
